﻿using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;

namespace Timo.Api.Core.Filter;

/// <summary>
/// 请求结果筛选器
/// 结果控制器常用于对返回的结果附加更多数据等处理
/// </summary>
public class ResultFilter : IAsyncResultFilter
{
    public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
    {
        // 获取控制器信息
        ControllerActionDescriptor? actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;

        // 获取路由表信息
        var routeData = context.RouteData;
        var controllerName = routeData.Values["controller"];
        var actionName = routeData.Values["action"];
        var areaName = routeData.DataTokens["area"];

        // 判断如果是 MVC 视图，可以动态添加数据到页面中
        if (context.Result is ViewResult viewResult)
        {
            // 动态添加数据，在 Razor 中就可以直接使用 @TempData["Name"] 获取数据了
            viewResult.TempData["Name"] = "Furion";

            // 动态添加数据，在 Razor 中就可以直接使用 @ViewBag.Version 或 @ViewData["Name"] 获取数据了
            viewResult.ViewData["Version"] = 1;
        }

        // 这里还可以强制性换掉 Result
        // context.Result = new ContentResult("....");

        // 执行下一个结果过滤器，如果直接短路返回，可设置 context.Cancel = true; 这样就不会执行下一个过滤器，这个和下列代码是互斥的
        var resultContext = await next();

        // 获取返回的结果
        var result = resultContext.Result;
    }
}
